<?php
declare (strict_types=1);

namespace app\admin\logic\system;

use app\admin\event\subscribes\config\ConfigActionLog as ConfigActionLogSubscribe;
use app\admin\model\system\Config as SystemConfigModel;
use app\common\exception\LogicException;
use think\facade\Event;

/**
 * 系统配置
 */
class Config
{

    /**
     * 需要检测是否开启了使用平台配置的正则规则
     *
     * @var array
     */
    static $checkUsePlatform = [
        // 配置中心: 上传 登录 支付 短信
        // '/^(system\.package\.(upload|login|payment|sms))(?!\.sync)/',
        '/^(system\.package\.(upload|payment|sms))(?!\.sync)/',
        // 配置中心: 人脸识别
        '/^(face\.config)(?!\.sync)/'
    ];

    /**
     * 强制获取自有配置(机构不配置时, 返回空而不是取平台的配置)
     *
     * @var array
     */
    static $forceOwnList = [
        // key => 默认配置
        // 登录配置
        'system.login'                  => ['type' => ['user'], 'unique' => 0],
        // 第三方登录方式
        'system.package.login'          => [],
        // 第三方登录 - QQ
        'system.package.login.qq'       => ['app_key' => '', 'app_secret' => '', 'open_device' => []],
        // 第三方登录 - 微信
        'system.package.login.weixin'   => ['app_key' => '', 'app_secret' => '', 'open_device' => []],
        // 直播
        'course.live.config.cclive'     => ['UserID' => '', 'APIKey' => '', 'classAPIKey' => ''],
        // 一键登录
        'system.login.oneclick'         => ['secretId' => '', 'secretKey' => '', 'businessId' => ''],
        // 微信小程序
        'system.login.miniapp'          => ['appid' => '', 'secret' => ''],
        // 微信公众号
        'system.config.official'        => ['appid' => '', 'secret' => ''],
        // 防挂机配置 - 人脸识别
        'system.onhook'                 => [],
        // 上传储存空间
        'system.package.upload'         => ['stock' => 'local'],
        // 上传 - 腾讯
        'system.package.upload.tencent' => [],
        // 上传 - 阿里云
        'system.package.upload.aliyun'  => [],
        // 上传 - CC
        'system.package.upload.bokecc'  => [],
        // 短信发送服务商
        'system.package.sms'            => ['provider' => ''],
        // 短信 - 阿里云
        'system.package.sms.aliyun'     => [],
        // 短信 - 腾讯
        'system.package.sms.tencent'    => [],
        // 支付方式
        'system.package.payment'        => [],
        // 支付 - 支付宝
        'system.package.payment.alipay' => [],
        // 支付 - 微信
        'system.package.payment.wxpay'  => [],
        // 分享
        'share.config'                  => []
    ];

    /**
     * 设置配置 - 存在时更新
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-03-25
     *
     * @param string $key   [description]
     * @param array  $value [description]
     */
    public static function set(string $key, array $value)
    {
        $config = app(SystemConfigModel::class)->scope('mhm')->where('key', $key)->findOrEmpty();
        if ($config->isEmpty()) $config->key = $key;

        $config->value = $value;

        if (!$config->save()) throw new LogicException("配置失败");
        // 触发日志写入
        if (!Event::hasListener('ConfigActionLogSubscribe')) {
            Event::subscribe(ConfigActionLogSubscribe::class);
        }
        Event::trigger('updateConfig', ['sys_key' => $key]);

        return $config;
    }

    /**
     * 获取配置
     *  指定第三个参数时
     *  1.如果机构有配置,则获取机构的配置
     *  2.机构没有配置,则获取平台的
     *  3.平台和机构均没有配置时返回默认值
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-03-25
     *
     * @param string   $key     配置标识
     * @param array    $default 默认值
     * @param int|null $mhm_id  获取指定机构机构的配置
     * @param bool     $own     是否强制获取当前机构的配置
     * @return array|mixed [type]                                  [description]
     */
    public static function get(string $key, array $default = [], $mhm_id = null, bool $own = false)
    {
        $mhm_id = is_null($mhm_id) ? (request()->mhm_id ?: 1) : $mhm_id;
        // 检测是否强制获取自己的配置
        $own = $own === false ? array_key_exists($key, Config::$forceOwnList) : true;
        if ($own === true) {
            // 获取自己的
            $config = app(SystemConfigModel::class)->where('mhm_id', $mhm_id)->where('key', $key)->findOrEmpty();
        } else if ($mhm_id != 1) {
            // 未配置默认使用平台配置  配置了使用平台
            $config = app(SystemConfigModel::class)->where(function ($query) use ($mhm_id) {
                $query->where('mhm_id', 1)->whereOr('mhm_id', $mhm_id);
            })->where('key', $key)->order('mhm_id', 'DESC')->findOrEmpty();
        } else {
            $config = app(SystemConfigModel::class)->where('mhm_id', 1)->where('key', $key)->findOrEmpty();
        }

        $default = empty($default) ? (Config::$forceOwnList[$key] ?? []) : $default;

        return !$config->isEmpty() ? $config->getAttr('value') : $default;
        // if ($mhm_id != 1) {
        //     // 检测能使用平台配置的key
        //     foreach (Config::$checkUsePlatform as $reg) {
        //         preg_match($reg, $key, $match);
        //         if ($match) {
        //             // 检测是否启用了平台配置
        //             $useKey = $match[1] . '.sync';
        //             $config = app(SystemConfigModel::class)->where('key', $useKey)->where('mhm_id', $mhm_id)->findOrEmpty();
        //             $val    = $config->getAttr('value');
        //             $used   = is_array($val) && isset($val['use_platform']) ? $val['use_platform'] : 1;
        //             if (request()->isAdminRoute) {
        //                 if ($own === true) {
        //                     $config = app(SystemConfigModel::class)->where('mhm_id', $mhm_id)->where('key', $key)->findOrEmpty();
        //                 } else {
        //                     $config = app(SystemConfigModel::class)->where(function ($query) use ($mhm_id) {
        //                         $query->where('mhm_id', 1)->whereOr('mhm_id', $mhm_id);
        //                     })->where('key', $key)->order('mhm_id', 'DESC')->findOrEmpty();
        //                 }
        //             } else {
        //                 // 未配置默认使用平台配置  配置了使用平台
        //                 if ($config->isEmpty() || $used) {
        //                     $config = app(SystemConfigModel::class)->where('mhm_id', 1)->where('key', $key)->findOrEmpty();
        //                 } else {
        //                     $config = app(SystemConfigModel::class)->where(function ($query) use ($mhm_id) {
        //                         $query->where('mhm_id', 1)->whereOr('mhm_id', $mhm_id);
        //                     })->where('key', $key)->order('mhm_id', 'DESC')->findOrEmpty();
        //                 }
        //             }
        //
        //             break;
        //         }
        //     }
        //     if (is_null($config)) {
        //         // 是否以.sync结尾
        //         $suff = '.sync';
        //         if (substr($key, -5) === $suff || request()->isAdminRoute) {
        //             $config = app(SystemConfigModel::class)->where('mhm_id', $mhm_id)->where('key', $key)->findOrEmpty();
        //         } else if (!request()->isAdminRoute) {
        //             // 不存在配置数据时, 使用默认的方式获取
        //             $config = app(SystemConfigModel::class)->where(function ($query) use ($mhm_id) {
        //                 $query->where('mhm_id', 1)->whereOr('mhm_id', $mhm_id);
        //             })->where('key', $key)->order('mhm_id', 'DESC')->findOrEmpty();
        //         }
        //     }
        //
        //
        // } else {
        //     $config = app(SystemConfigModel::class)->where('mhm_id', 1)->where('key', $key)->findOrEmpty();
        // }
        //
        // return ($config && !$config->isEmpty()) ? $config->getAttr('value') : $default;
    }
}
